package futbol.tacticas.concursantes.Javintero;
import java.awt.Color;
import java.awt.Point;
import java.util.Random;
import java.util.Vector;

import futbol.General;
import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoPase;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;
import futbol.tacticas.concursantes.Tactica;

public class Javintero implements Tactica {

	 private int jugadoresIniciales[][]={
		        {-150,-17,8},                    
		        {-150,17,8},                   
		        {-143,0,8},                 
		        {-100,40,8},                 
		        {-100,-40,8},                
		        {-40,0,8},                   
		       {-20,30,8},                  
		        {-20,-30,8},               
		        {105,-40,8} ,               
		        {110,0,8},                
		        {100,40,8}               
		    };
	
	 private int jugadoresActual[][]={
		        {-150,-17},                    
		        {-150,17},                   
		        {-120,-15},                 
		        {-100,40},                 
		        {-100,-40},                
		        {-40,0},                   
		       {-20,30},                  
		        {-20,-30},               
		        {105,-40} ,               
		        {110,0},                
		        {100,40}               
		    };
	 
	
	 private int contrariosAnterior[][] = new int[11][2];
	 
	 private int contrariosActual[][] = new int[11][2];
	 
	 private int[] yocubro = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
	 
	
	 
	 public Javintero()
	 {
		for(int i=0;i<11;i++) yocubro[i] = -1;
	 }
	 
	public Color getColor1() 
	{
		return Color.YELLOW;
	}

	public Color getColor2() 
	{
		return Color.YELLOW;
	}

	public Color getColorNumero() 
	{
		return Color.BLACK;
	}

	public Vector<Comando> getComandos(SituacionJugadores sj) 
	{
		
		if(sj.getBola().x == 0 && sj.getBola().y == 0) for(int i=0;i<11;i++) yocubro[i] = -1;
			
		/* Se inicializa el vector de comandos en cada turno */
		Vector<Comando> com=new Vector<Comando>();
		
		/* TODO: es necesario controlar que los jugadores no se
		 * salgan del campo al correr.
		 * 
		 * Estrategia patio de colegio, tooos a por la bola
		 * y patadon alante.
		 * 
		 * Estrategia de equipo: percepción actuación y ayudas entre jugadores.
		 */
		
		
		
		
		/* 
		 * Se recoge la posición de los jugadores en el campo
		 * se guardan las posiciones anteriores de los contrarios. 
		 * 
		 */
        for(int i=0;i<11;i++)
        {
            jugadoresActual[i][0]=sj.getMisJugadores()[i].x;
            jugadoresActual[i][1]=sj.getMisJugadores()[i].y;
            contrariosAnterior[i] = contrariosActual[i];
            contrariosActual[i][0]=sj.getContrario()[i].x;
            contrariosActual[i][1]=sj.getContrario()[i].y;
        }

		
		int mioMasCercaBola;
		
		if(sj.estoyMasCercaDeBola())
		{
			com=tacticaOfensiva(sj);
			
		}
		else
		{
			com = tacticaDefensiva(sj);
		}
			
        for(int i=0;i<11;i++)
        {
        	com.add(new ComandoPase(i,i+1));
        	com.add(new ComandoTiroAPuerta(i,10));
        }
        	
		return com;
	}
	
	
	private Vector<Comando> tacticaOfensiva(SituacionJugadores sj)
	{
		
		Random aleat = new Random();
		
		/* Se recoge la posición de la bola en el campo */
		Point bola =  sj.getBola();
		
		Vector<Comando> com = new Vector<Comando>();
		int mioMasCercaBola;
		
	 	mioMasCercaBola = sj.getMiJugadorMasCerca(bola.x, bola.y);
	 	if(jugadoresActual[mioMasCercaBola][0] == bola.x && jugadoresActual[mioMasCercaBola][1] == bola.y)
	 	{
	 		com.add(new ComandoGolpearBola(mioMasCercaBola,jugadoresActual[mioMasCercaBola][0] + 2, jugadoresActual[mioMasCercaBola][1] + aleat.nextInt(2)));
	 		
	 	}
	 	com.add(new ComandoIrA(mioMasCercaBola,bola.x, bola.y));
       
	 	return com;
		
	}
	

	
	private Vector<Comando> tacticaDefensiva(SituacionJugadores sj)
	{
		
		Random aleat = new Random();
		
		/* Se recoge la posición de la bola en el campo */
		Point bola =  sj.getBola();
		
		Vector<Comando> com = new Vector<Comando>();
		int mioMasCercaBola;
		
	 	mioMasCercaBola = sj.getMiJugadorMasCerca(bola.x, bola.y);
	 	com.add(new ComandoIrA(mioMasCercaBola,bola.x, bola.y));

	 	if(jugadoresActual[mioMasCercaBola][0] == bola.x && jugadoresActual[mioMasCercaBola][1] == bola.y)
	 	{
	 		com.add(new ComandoGolpearBola(mioMasCercaBola,jugadoresActual[mioMasCercaBola][0] + 2, jugadoresActual[mioMasCercaBola][1] + aleat.nextInt(2)));
	 		
	 	}
	 	
	 	boolean[] cubierto = {false,false,false,false,false,false,false,false,false,false,false};
	 	for(int i = 0;i<11;i++)
	 	{
	 		boolean nomas = false;
	 		for(int z = 0; z<11;z++)
	 		{
	 			if(yocubro[z] == i) 	com.add(new ComandoIrA(i,sj.getContrario()[z].x, sj.getContrario()[z].y));
	 			nomas = true;
	 			break;
	 		}
	 		
	 		
	 		if(!nomas)
	 		{
		 		int ccerca = sj.getContrarioMasCerca(i);
		 		int j = 0;
		 		while(yocubro[ccerca] != -1 && yocubro[ccerca] != i && j < 20)
		 		{
		 			ccerca =  aleat.nextInt(10);
		 			j++;
		 		}
		 		if(j<20)
		 		{
		 			yocubro[ccerca] = i;
		 			com.add(new ComandoIrA(i,sj.getContrario()[ccerca].x, sj.getContrario()[ccerca].y));
		 		}
	 		}
	 			 		
	 	}
	 	
	 	
	 	return com;
		
	}

	
	
	
	public int getFuerza(int n) 
	{
		return jugadoresIniciales[n][2];
	}

	public String getNombre() 
	{
		return "Javintero";
	}

	public int getXInicial(int n) 
	{
		return jugadoresIniciales[n][0];
	}

	public int getYInicial(int n) 
	{
		return jugadoresIniciales[n][1];
	}

}
